/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.javiermoreno.bankof.servicios;

import com.javiermoreno.bankof.dominio.CuentaAhorro;
import com.javiermoreno.bankof.dominio.CuentaCorriente;
import com.javiermoreno.bankof.dominio.ProductoFinanciero;
import com.javiermoreno.framework.errores.BusinessException;
import java.util.*;

/**
 *
 * @author Administrador
 */
public class GestionProductosFinancierosServFake implements GestionProductosFinancierosServ {
    
    private Map<String, ProductoFinanciero> datos =
            new HashMap<String, ProductoFinanciero>();

    GestionProductosFinancierosServFake() {
        
        datos.put("1111", new CuentaCorriente("1111", 1000.0, 0.03));
        datos.put("2222", new CuentaCorriente("2222", 1500.0, 0.03));
        datos.put("3333", new CuentaAhorro("3333", 500.0, 0.04, false));
        datos.put("4444", new CuentaCorriente("4444", 1200.0, 0.03));
        
    }
    
    
    @Override
    public Set<ProductoFinanciero> obtenerProductosCliente(String username) {
        Set<ProductoFinanciero> resultado = new HashSet<ProductoFinanciero>();
        Collection<ProductoFinanciero> valores = datos.values();
        resultado.addAll(valores);
        
        return resultado;
    }
    
    @Override
    public Set<CuentaCorriente> obtenerCuentasCorrienteCliente(String username) {
        Set<CuentaCorriente> resultado = new HashSet<CuentaCorriente>();
        
        for (ProductoFinanciero prodActual : datos.values()) {
            if (prodActual instanceof CuentaCorriente) {
                CuentaCorriente cc = (CuentaCorriente) prodActual;
                resultado.add(cc);
            }
        }
        
        return resultado;
    }

    @Override
    public void ejecutarTransferencia(String username, String codigoOrigen,
                                      String codigoDestino, double importe) {
        if (codigoOrigen.equals(codigoDestino) == true) {
            IllegalArgumentException exc = new IllegalArgumentException(
               "GestionProductosFinancierosServFake.ejecutarTransferencia.error.OrigenIgualDestino");
            throw exc;
        }        
        if (importe > 500) {
            BusinessException exc = new BusinessException(
               "GestionProductosFinancierosServFake.ejecutarTransferencia.error.ImporteMaximoSobrepasado");
            throw exc;
        }        
        CuentaCorriente cc = (CuentaCorriente) datos.get(codigoOrigen);
        // comprobar que cc existe (IllegalArgumentException)
        if (cc == null) {
            IllegalArgumentException exc = new IllegalArgumentException(
               "GestionProductosFinancierosServFake.ejecutarTransferencia.error.CCInexistente");
            throw exc;
        }
        // comprobar que cc es del cliente indicado por username (IllegalArgumentException)
        // ...        
        ProductoFinanciero pf = datos.get(codigoDestino);
        if (pf == null) {
            BusinessException exc = new BusinessException(
              "GestionProductosFinancierosServFake.ejecutarTransferencia.error.PFInexistente");
            throw exc;
        }
        cc.transferir(pf, importe);
        
    }
    
    
    
}









